package com.zp.self.module.level_4_算法练习.数据结构.String;

import java.util.ArrayDeque;
import java.util.Deque;

/**
 * @author By ZengPeng
 */
public class 力扣_71_简化路径 {
    //测试
    public static void main(String[] args) {

//        System.out.println(new 力扣_71_简化路径().simplifyPath("/home/"));
//        System.out.println(new 力扣_71_简化路径().simplifyPath("/../"));
        System.out.println(new 力扣_71_简化路径().simplifyPath("/a//b////c/d//././/.."));
//        System.out.println(new 力扣_71_简化路径().simplifyPath("/"));
//        System.out.println(new 力扣_71_简化路径().simplifyPath("/home//foo/"));
//        System.out.println(new 力扣_71_简化路径().simplifyPath("/a/./b/../../c/"));
        System.out.println(new 力扣_71_简化路径().simplifyPath("/a/./b/../../c/f"));
    }

    /**
    题目：给你一个字符串 path ，表示指向某一文件或目录的 Unix 风格 绝对路径 （以 '/' 开头），
     请你将其转化为更加简洁的规范路径。
     在 Unix 风格的文件系统中，一个点（.）表示当前目录本身；
     此外，两个点 （..） 表示将目录切换到上一级（指向父目录）；两者都可以是复杂相对路径的组成部分。
         任意多个连续的斜杠（即，'//'）都被视为单个斜杠 '/' 。 对于此问题，
         任何其他格式的点（例如，'...'）均被视为文件/目录名称。

     请注意，返回的 规范路径 必须遵循下述格式：
     始终以斜杠 '/' 开头。
     两个目录名之间必须只有一个斜杠 '/' 。
     最后一个目录名（如果存在）不能 以 '/' 结尾。
     此外，路径仅包含从根目录到目标文件或目录的路径上的目录（即，不含 '.' 或 '..'）。
     返回简化后得到的 规范路径 。

     示例 1：
     输入：path = "/home/"
     输出："/home"
     解释：注意，最后一个目录名后面没有斜杠。

     示例 2：
     输入：path = "/../"
     输出："/"
     解释：从根目录向上一级是不可行的，因为根目录是你可以到达的最高级。

     示例 3：
     输入：path = "/home//foo/"
     输出："/home/foo"
     解释：在规范路径中，多个连续斜杠需要用一个斜杠替换。

     示例 4：
     输入：path = "/a/./b/../../c/"
     输出："/c"

    分析：
       1.队列来存储目录前面的文件名,出现上划线 ，说明到文件夹啦  -- 执行用时：2 ms, 在所有 Java 提交中击败了99.11%的用户

    边界值 & 注意点：
       1.//  转换 为/
       2.特殊的./  和 ../ 需要转换掉
       3.//最后结尾/..  与  /f
     **/
    public String simplifyPath(String path) {
        Deque<String> deque = new ArrayDeque<>();
        int start=0;
        for (int i = 0; i < path.length(); i++) {
           if(path.charAt(i)=='/') {
               if(i>start){
                   String file = path.substring(start, i);
                   switch (file) {
                       case "..":
                           deque.pollLast(); break;
                       case ".": break;
                       default: deque.add(file);
                   }
               }
               start=i+1;
           }
        }
        //最后结尾/..
        if(start!=path.length()){
            switch (path.substring(start)) {
                case "..":
                    deque.pollLast(); break;
                case ".":  break;
                default: deque.add(path.substring(start));
            }
        }
        StringBuilder sb =new StringBuilder();
        while (!deque.isEmpty())
            sb.append("/").append(deque.pop());
        return sb.length()==0?"/":sb.toString();
    }
}
